#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>

/*
	父进程fork三个子进程: 
		其中一个调用ps命令;
		一个调用自定义应用程序;
		一个调用会出现段错误的程序。
		父进程回收三个子进程(waitpid)，并且打印三个子进程的退出状态。
*/


int main(int argc,char*argv[])
{
	//需要fork三个子进程，因此使用for循环
	int i = 0;
	int status;
	for(i;i<3;i++)
	{
		pid_t pid  = fork();
		if(pid<0)
		{
			perror("fork error");
			exit(1);
		}
		else if(pid > 0)//此时为父进程
		{
			//回收三个子进程，循环回收
		}
		else if(pid == 0)//此时为子进程
		{
			printf("第【%d】个子进程创建成功\n",i);
			break;
		}
	}
	if(i == 0)//为第一个子进程
	{
		//调用自定义引用程序
		execl("./test01","test01","Hello","word","Ni","Hao!",NULL);
	}

	if(i == 1)//为第二个子进程
	{
		//调用ps命令
		execlp("ps","ps",NULL);
		execl("/bin/ls","ps",NULL);
	}
	if(i == 2)//为第三个子进程
	{
		//错误退出
		char *p = "hello world";
		p[0] = 'a';
	}
	if(i == 3)//为第父进程	
	{
		while(1)	
		{
			pid_t wpid = waitpid(-1,&status,WNOHANG);
			if(wpid==0)
				continue;
			if(wpid == -1)
				break;
			if(wpid > 0)
			{
				if(WIFEXITED(status))//正常退出
				{
					printf("child normal exit,status==[%d]\n",WEXITSTATUS(status));
				}
				else if(WIFSIGNALED(status))//被信号杀死
				{
					printf("child killed by signal,signo==[%d]\n",WTERMSIG(status));
				}
			}	
		}
	}
	return 0;
}
